/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gestionedt.resolution;

import gestionedt.controllers.*;
import gestionedt.solveur.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

/**
 *
 */
public class ResoudreAction extends DispatchAction {

    /**
     * Instancie un solveur d'emploi du temps.
     * @return
     */
    private SolveurEDT instancierSolveur() {
        
        EnseignantJpaController ctEns = new EnseignantJpaController();
        ModuleJpaController ctModule = new ModuleJpaController();
        PoolJpaController ctPool = new PoolJpaController();
        PrestationJpaController ctPrest = new PrestationJpaController();
        GroupeJpaController ctGroupe = new GroupeJpaController();
        CreneauJpaController ctCreneau = new CreneauJpaController();

        return new SolveurEDTCHOCO(ctEns.findEnseignantsAvecRel(),
                                   ctModule.findModulesAvecRel(),
                                   ctPool.findPoolsAvecRel(),
                                   ctPrest.findPrestationsAvecRel(),
                                   ctGroupe.findGroupesAvecRel(),
                                   ctCreneau.findCreneauxAvecRel());
    }

    /**
     * Vérifie la cohérence de l'emploi du temps tel qu'il est actuellement
     * et retourne les messages générés par cette vérification.
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws java.lang.Exception
     */
    public ActionForward verifierCoherenceEDT(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        ResolutionForm rForm = (ResolutionForm) form;
        SolveurEDT solveur = instancierSolveur();

        String[] conflits = solveur.verifier();
        List<String> msg;
        if(conflits.length > 0) {
            rForm.setTypeMessage(ResolutionForm.TypeMessage.ERREUR);
            rForm.setTitreMessages("Conflits trouvés");
            msg = Arrays.asList(conflits);
            rForm.setMessages(msg);
        }
        else {
            rForm.setTypeMessage(ResolutionForm.TypeMessage.INFO);
            rForm.setTitreMessages("Pas de conflit trouvé");
            msg = new ArrayList<String>(1);
            msg.add("Aucune incohérence n'a été détectée dans " +
                    "l'emploi du temps tel qu'il est actuellement.");
            rForm.setMessages(msg);
        }
        return mapping.findForward("envoyermsg");
    }

    /**
      Essaye de résoudre le problème de l'emploi du temps, en effectuant
     * une vérification au préalable.
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws java.lang.Exception
     */
    public ActionForward resoudreEDT(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        ResolutionForm rForm = (ResolutionForm) form;
        SolveurEDT solveur = instancierSolveur();

        String[] conflits = solveur.verifier();
        List<String> msg;
        if(conflits.length > 0) {
            rForm.setTypeMessage(ResolutionForm.TypeMessage.ERREUR);
            rForm.setTitreMessages("Conflits trouvés");
            msg = Arrays.asList(conflits);
            rForm.setMessages(msg);
            rForm.setResolu(false);
        }
        else {
            boolean estResolu = solveur.resoudre();
            rForm.setResolu(estResolu);
            if(estResolu) {
                rForm.setTypeMessage(ResolutionForm.TypeMessage.SUCCES);
                rForm.setTitreMessages("Problème résolu");
                msg = new ArrayList<String>();
                msg.add("Une solution a été trouvée. Toutes les prestations " +
                        "ont été placées sur l'emploi du temps et tous les " +
                        "groupes suivent une prestation de chaque module " +
                        "auquel ils sont inscrits.");
                rForm.setMessages(msg);
            }
            else {
                rForm.setTypeMessage(ResolutionForm.TypeMessage.ERREUR);
                rForm.setTitreMessages("Aucune solution trouvée");
                msg = new ArrayList<String>();
                msg.add("Le solveur n'a trouvé aucune solution, le problème " +
                        "semble sur-contraint (peut-être qu'il n'y a pas " +
                        "assez de prestations pour certains modules).");
                rForm.setMessages(msg);
            }
        }
        return mapping.findForward("envoyermsg");
    }

}